package com.kkks.spring_rest.tick.dao;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;


/**
 * @author SC
 * @version 1.0
 * @created 2012-6-11 下午03:29:52
 * @describe 数据操作基本类
 */

public interface HibernateTemplateBaseDao<T> {

	/**
	 * 描述 通过 id 主键查询对象实体
	 * 
	 * @param id
	 * @return 实体类
	 */
	public T findById(Class<T> entityClass, Serializable id);
	/**
	 * 描述 多条件查询实体对象
	 * 
	 * @param hql
	 * @param values
	 * @return 实体类
	 */
	public T findTByHql(final String hql, final Object... values);// TODO

	
	/**
	 * 描述 获取所有实体集合
	 * 
	 * @param entityClass
	 * @return List<T> 集合
	 */
	public List<T> findAll(Class<T> entityClass);// TODO
	/**
	 * 描述 获取所有实体集合 分页方法
	 * @param hql
	 * @param firstResult
	 * @param length
	 * @return List<T> 集合
	 */
	public List<T> findPaginationAllList(final String hql,
			final int firstResult, final int length) ;// TODO
	
	
	
	/**
	 * 描述 通过 hql语句 ，参数值 查询实体集合
	 * 
	 * @param hql
	 * @param values
	 * @return List<T> 集合
	 */
	public List<T> findListByHql(String hql, Object... values);// TODO
	/**
	 * 描述 通过 hql语句 ，参数值 查询实体集合分页方法
	 * @param hql
	 * @param firstResult
	 * @param length
	 * @param objects
	 * @return List<T> 集合
	 */
	public List<T> findPaginationListByHql(final String hql,
			final int firstResult, final int length, final Object... objects);
			
			
	/**
	 * 模糊查询列表信息
	 * 
	 * @param tableName
	 * @param names
	 * @param values
	 * @param flag
	 * @return List<?>
	 */
	public List<?> QueryFuzzyForList(final String tableName, final String[] names,
			final String[] values, final String[] flag);// TODO
	/**
	 * 模糊查询列表信息 分页
	 * 
	 * @param tableName
	 * @param names
	 * @param values
	 * @param flag
	 * @param firstResult
	 * @param maxResults
	 * @return List<?>
	 */
	public List<?> QueryFuzzyForPaginationList(final String tableName, final String[] names,
			final String[] values, final String[] flag, final int firstResult,
			final int maxResults);// TODO

	
	/**
	 * 描述 按照HQL语句查询唯一对象
	 * 
	 * @param hql
	 * @param values
	 * @return OBJECT对象
	 */
	public Object findUnique(final String hql, final Object... values);// TODO

	/**
	 * 描述 查找指定HQL并返回INT型
	 * 只能用于查询对象，不能用于查询某些特定指定结果集的值
	 * @param hql
	 * @param values
	 * @return int
	 */
	public int findInt(final String hql, final Object... values);// TODO

	/**
	 * 描述 获取指定实体Class指定条件的记录总数
	 * 
	 * @param entityClass
	 * @param where
	 * @param values
	 * @return int
	 */
	public int findTotalCount(Class<T> entityClass, final String where,
			final Object... values);// TODO

	/**
	 * 描述 获取指定实体Class的记录总数
	 * 
	 * @param entityClass
	 * @return int
	 */
	public int findTotalCount(Class<T> entityClass);// TODO
	
	
	/*
	 * ------------------------------------------------------------------
	 * ------------------------------------------------------------------
	 * -------------------------华丽的分割线---------------------------
	 * ------------------------------------------------------------------
	 * ------------------------------------------------------------------
	 */

	/**
	 * 描述 保存指定实体类
	 * 
	 * @param entity
	 */
	public void save(T entity);// TODO

	/**
	 * 描述 保存或更新指定实体类
	 * 
	 * @param entity
	 */
	public void saveOrUpdate(T entity);// TODO

	/**
	 * 描述 删除指定的实体类
	 * 
	 * @param entity
	 */
	public void deleteObject(T entity);// TODO

	/**
	 * 描述 通过 主键id 删除指定的实体类
	 * 
	 * @param id
	 */
	public void deleteObjectById(Class<T> entityClass, Serializable id);// TODO

	/**
	 * 描述 根据查询条件与参数列表创建Query对象
	 * 
	 * @param session
	 * @param hql
	 * @param objects
	 * @return Query 对象
	 */
	public Query createQuery(Session session, String hql, Object... objects);// TODO

	
}
